package gestionSites;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Observable;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;

/**
 * gestionnaire de site
 * 
 */
public class SiteListHandler extends Observable {
	
	/**
	 * chemin vers le fichier xml
	 */
	private String path;
	
	/**
	 * liste de sites
	 */
	private SiteList list;
	
	/**
	 * site courant
	 */
	private Site currentSite;
	
	/**
	 * constructeur
	 *
	 */
	public SiteListHandler(){
		
		list = new SiteList();
		path = "";
	}
	
	/**
	 * sauvegarde de la liste de sites
	 *
	 */
	public void writeList(){
		try{
			
			// Instanciation de la classe XStream
		    XStream xstream = new XStream(new DomDriver());
		    // Instanciation d'un fichier listeSites.xml
		    File file = new File(path+"listeSites.xml");
		    // Instanciation d'un flux de sortie fichier vers
		    // path+listeSites.xml
		    FileOutputStream fos = new FileOutputStream(file);
		    
		    try {
				// S�rialisation de l'objet article dans listeSites.xml
				xstream.toXML(list, fos);
				
		    }finally {
				// On s'assure de fermer le flux quoi qu'il arrive
				fos.close();
			}
		    
		}catch (FileNotFoundException e) {
		    System.out.println("XML file not found");
		    
		} catch (IOException ioe) {
			 System.out.println("XML file broken");
		}	
		setChanged();
		notifyObservers();
	}
	
	/**
	 * chargement de la liste de sites
	 *
	 */
	public void loadList(){
		
		try{
			 // Instanciation de la classe XStream
            XStream xstream = new XStream(new DomDriver());
            
            // Redirection du fichier listeSites.xml vers un flux
            // d'entr�e fichier
            FileInputStream fis = new FileInputStream(new File(path+"listeSites.xml"));
            
            // D�s�rialisation du fichier listeSites.xml vers un nouvel
            // objet article
            list = (SiteList) xstream.fromXML(fis);
  
            // On s'assure de fermer le flux quoi qu'il arrive
            fis.close();
            
            
		} catch (FileNotFoundException e) {
			//e.printStackTrace();
            
        } catch (IOException ioe) {
            
        }
		
	}
	
	/**
	 * acc�s � la liste de sites
	 * @return liste des sites
	 */
	public SiteList getList() {
		return list;
	}

	/**
	 * modification de la liste de sites
	 * @param list nouvelle liste de sites
	 */
	public void setList(SiteList list) {
		this.list = list;
	}

	/**
	 * ajout d'un site
	 * @param _site site � ajouter
	 */
	public void add(Site _site){
		this.list.addSite(_site);
	}
	
	/**
	 * suppression d'un site
	 * @param _site site � supprimer
	 */
	public void remove(Site _site){
		System.out.println(_site.getName());
		File file = new File(_site.getTarget()+"/"+_site.getName());
		deleteRepertory(file);
		File file2 = new File(_site.getTarget());
		File[] subfiles = file2.listFiles();
		if (subfiles.length==0) {
			deleteRepertory(file2);
		}
		this.list.removeSite(_site);
		setChanged();
		notifyObservers();
	}
	
	/**
	 * suppression r�cursive d'un r�pertoire
	 * @param file fichier ou dossier � supprimer
	 */
	private void deleteRepertory(File file) {
		if (file.isDirectory()){
			File[] subfiles = file.listFiles();
			for (File f:subfiles) {
				deleteRepertory(f);
				//System.out.println(f.getName());
			}
		}
		file.delete();
	}

	/**
	 * transformation dufichier XML
	 * @param _xslFile chemin du fichier xml
	 * @throws IOException exception d'input/output
	 * @throws TransformerException exception de transformation
	 */
	public void xmlTransformer(String _xslFile) throws IOException, TransformerException{
		
		StreamSource stylesource = new StreamSource(_xslFile);
	      StreamSource source = new StreamSource("listeSites.xml");

	      TransformerFactory factory = TransformerFactory.newInstance();
	      Transformer transformer = factory.newTransformer(stylesource);
	      
	      File copyFile = new File("substitue.xml");
	      File file = new File("listeSites.xml");

	      copyFile.createNewFile();

	      StreamResult result = new StreamResult("substitue.xml");
	      transformer.transform(source, result);
	      
	      file.delete();
	      copyFile.renameTo(new File("listeSites.xml"));
	     
	}
	
	/**
	 * tri du fichier xml
	 * @param fileName nom du fichier xml
	 */
	public void xmlSort(String fileName ){
		try {
			xmlTransformer(fileName);
		} catch (IOException e) {
			
		} catch (TransformerException e) {
			
		}
		setChanged();
		notifyObservers("TRI");
	}

	/**
	 * modification du site courant
	 * @param site le nouveau site courant
	 */
	public void setCurrentSite(Site site) {
		currentSite = site;
	}
	
	/**
	 * acc�s au site courant
	 * @return site courant
	 */
	public Site getCurrentSite() {
		return currentSite;
	}

}
